home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / machserver / 1.098 / fspdev / fspdevOps.c < prev    next >
C/C++ Source or Header  |  1991-06-26  |  12KB  |  327 lines

  1. /* 
  2.  * fsPdevOps.c --
  3.  *
  4.  *    Routine for initializing the fsOpTable switch entries for 
  5.  *    pseudo-devices and pseudo-filesystems.
  6.  *
  7.  * Copyright 1989 Regents of the University of California
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  */
  16.  
  17. #ifndef lint
  18. static char rcsid[] = "$Header: /sprite/src/kernel/fspdev/RCS/fspdevOps.c,v 9.3 91/06/26 01:01:34 mottsmth Exp $ SPRITE (Berkeley)";
  19. #endif /* not lint */
  20.  
  21. #include <sprite.h>
  22. #include <fs.h>
  23. #include <fsconsist.h>
  24. #include <fsio.h>
  25. #include <fsNameOps.h>
  26. #include <fspdev.h>
  27. #include <fspdevInt.h>
  28. #include <fsrmt.h>
  29. #include <fsioFile.h>
  30. /*
  31.  * fs_DomainLookup for FS_REMOTE_SPRITE_DOMAIN type.
  32.  */
  33.  
  34. static Fs_DomainLookupOps pdevDomainLookup =  {
  35.      Fsio_NoProc, FspdevPfsExport, FspdevPfsOpen, FspdevPfsGetAttrPath, 
  36.      FspdevPfsSetAttrPath,
  37.      FspdevPfsMakeDevice, FspdevPfsMakeDir, FspdevPfsRemove, FspdevPfsRemoveDir,
  38.      FspdevPfsRename, FspdevPfsHardLink
  39. };
  40.  
  41. static Fs_AttrOps pdevAttrOpTable = { FspdevPseudoGetAttr, FspdevPseudoSetAttr };
  42.  
  43. static Fsio_OpenOps pdevOpenOps[] = { 
  44.     /*
  45.      * Pseudo devices.
  46.      */
  47.     {FS_PSEUDO_DEV, FspdevNameOpen},
  48.     { FS_PSEUDO_FS, Fsio_NoProc},
  49.     /*
  50.      * A remote link can either be treated like a regular file,
  51.      * or opened by a pseudo-filesystem server.
  52.      */
  53.     { FS_REMOTE_LINK, FspdevRmtLinkNameOpen },
  54. };
  55. static int numPdevOpenOps = sizeof(pdevOpenOps)/
  56.                  sizeof(pdevOpenOps[0]);
  57. /*
  58.  * File stream type ops for FSIO_CONTROL_STREAM, FSIO_SERVER_STREAM,
  59.  * and FSIO_LCL_PSEUDO_STREAM FSIO_RMT_PSEUDO_STREAM FSIO_PFS_CONTROL_STREAM
  60.  * FSIO_PFS_NAMING_STREAM FSIO_LCL_PFS_STREAM FSIO_RMT_CONTROL_STREAM 
  61.  * FSIO_PASSING_STREAM
  62.  */
  63.  
  64. static Fsio_StreamTypeOps pdevFileStreamOps[] = {
  65.     /*
  66.      * A control stream is what a pdev server process gets when it opens a
  67.      * pseudo device file.  This stream is used to notify the server
  68.      * of new clients; the ID of the server stream set up for each
  69.      * new client is passed over this control stream.
  70.      */
  71.     { FSIO_CONTROL_STREAM, FspdevControlIoOpen,
  72.         FspdevControlRead, Fsio_NoProc,
  73.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,     /* Paging routines */
  74.         FspdevControlIOControl, FspdevControlSelect,
  75.         FspdevControlGetIOAttr, FspdevControlSetIOAttr,
  76.         FspdevControlVerify,
  77.         Fsio_NoProc, Fsio_NoProc,        /* migStart, migEnd */
  78.         Fsio_NoProc, FspdevControlReopen,    /* migrate, reopen */
  79.         FspdevControlScavenge, FspdevControlClientKill,
  80.         FspdevControlClose },
  81.     /*
  82.      * A server stream gets set up for the server whenever a client opens
  83.      * a pseudo device.  The server reads the stream the learn about new
  84.      * requests from the client.  IOControls on the stream are used
  85.      * to control the connection to the client.
  86.      */
  87.     { FSIO_SERVER_STREAM, Fsio_NoProc,
  88.         FspdevServerStreamRead, Fsio_NoProc,
  89.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,     /* Paging routines */
  90.         FspdevServerStreamIOControl, FspdevServerStreamSelect,
  91.         Fsio_NullProc, Fsio_NullProc,        /* Get/Set IO Attr */
  92.         Fsio_NoHandle,                /* verify */
  93.         Fsio_NoProc, Fsio_NoProc,        /* migStart, migEnd */
  94.         Fsio_NoProc, Fsio_NoProc,        /* migrate, reopen */
  95.         (Boolean (*)())NIL,            /* scavenge */
  96.         Fsio_NullClientKill, FspdevServerStreamClose },
  97.     /*
  98.      * A pseudo stream with the server process running locally.  
  99.      */
  100.     { FSIO_LCL_PSEUDO_STREAM, FspdevPseudoStreamIoOpen,
  101.         FspdevPseudoStreamRead,    FspdevPseudoStreamWrite,
  102.         FspdevPseudoStreamRead,    FspdevPseudoStreamWrite, /* Paging */
  103.         Fsio_NoProc,     /* Paging routines */
  104.         FspdevPseudoStreamIOControl,
  105.         FspdevPseudoStreamSelect,
  106.         FspdevPseudoStreamGetIOAttr, FspdevPseudoStreamSetIOAttr,
  107.         Fsio_NoHandle,                /* verify */
  108.         FspdevPseudoStreamMigClose, FspdevPseudoStreamMigOpen,
  109.         FspdevPseudoStreamMigrate,
  110.         Fsio_NoProc,                /* reopen */
  111.         (Boolean (*)())NIL,            /* scavenge */
  112.         Fsio_NullClientKill, FspdevPseudoStreamClose },
  113.     /*
  114.      * A pseudo stream with a remote server.  
  115.      */
  116.     { FSIO_RMT_PSEUDO_STREAM, FspdevRmtPseudoStreamIoOpen,
  117.         Fsrmt_Read, Fsrmt_Write,
  118.         Fsrmt_Read, Fsrmt_Write,        /* Paging I/O */
  119.         Fsio_NoProc,     /* Paging routines */
  120.         Fsrmt_IOControl, Fsrmt_Select,
  121.         Fsrmt_GetIOAttr, Fsrmt_SetIOAttr,
  122.         FspdevRmtPseudoStreamVerify,
  123.         Fsrmt_IOMigClose, Fsrmt_IOMigOpen,
  124.         FspdevRmtPseudoStreamMigrate,
  125.         Fsio_NoProc,                /* reopen */
  126.         Fsutil_RemoteHandleScavenge, Fsio_NullClientKill,
  127.         Fsrmt_IOClose },
  128.     /*
  129.      * A control stream used to mark the existence of a pseudo-filesystem.
  130.      * The server doesn't do I/O to this stream; it is only used at
  131.      * open and close time.
  132.      */
  133.     { FSIO_PFS_CONTROL_STREAM, FspdevPfsIoOpen,
  134.         Fsio_NoProc, Fsio_NoProc,        /* read, write */
  135.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,     /* Paging I/O */
  136.         Fsio_NoProc, Fsio_NoProc,        /* IOControl, select */
  137.         Fsio_NullProc, Fsio_NullProc,        /* Get/Set IO Attr */
  138.         FspdevControlVerify,
  139.         Fsio_NoProc, Fsio_NoProc,        /* migStart, migEnd */
  140.         Fsio_NoProc, FspdevControlReopen,    /* migrate, reopen */
  141.         FspdevControlScavenge, FspdevControlClientKill,
  142.         FspdevControlClose },
  143.     /*
  144.      * The 'naming stream' for a pseudo-filesystem is used to forward lookup
  145.      * operations from the kernel up to the user-level server.  It is like
  146.      * a regular pdev request-response stream, except that extra connections
  147.      * to it are established via the prefix table when remote Sprite hosts
  148.      * import a pseudo-filesystem.  The routines here are used to set this up.
  149.      * This stream is only accessed locally.  To remote hosts the domain is
  150.      * a regular remote sprite domain, and the RPC stubs on the server then
  151.      * switch out to either local-domain or pseudo-domain routines.
  152.      */
  153.     { FSIO_PFS_NAMING_STREAM, FspdevPfsNamingIoOpen,
  154.         Fsio_NoProc, Fsio_NoProc,        /* read, write */
  155.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,     /* Paging I/O */
  156.         Fsio_NoProc, Fsio_NoProc,        /* IOControl, select */
  157.         Fsio_NullProc, Fsio_NullProc,        /* Get/Set IO Attr */
  158.         FspdevRmtPseudoStreamVerify,
  159.         Fsio_NoProc, Fsio_NoProc,        /* migStart, migEnd */
  160.         Fsio_NoProc, Fsio_NoProc,        /* migrate, reopen */
  161.         Fsutil_RemoteHandleScavenge, Fsio_NullClientKill,
  162.         Fsrmt_IOClose },
  163.     /*
  164.      * A pseudo stream to a pseudo-filesystem server.  This is just like
  165.      * a pseudo stream to a pseudo-device server, except for the CltOpen
  166.      * routine because setup is different.  
  167.      */
  168.     { FSIO_LCL_PFS_STREAM, FspdevPfsStreamIoOpen,
  169.         FspdevPseudoStreamRead,    FspdevPseudoStreamWrite,
  170.         FspdevPseudoStreamRead,    FspdevPseudoStreamWrite, /* Paging */
  171.         Fsio_NoProc,     /* Paging I/O */
  172.         FspdevPseudoStreamIOControl,
  173.         FspdevPseudoStreamSelect,
  174.         FspdevPseudoStreamGetIOAttr, FspdevPseudoStreamSetIOAttr,
  175.         Fsio_NoHandle,                    /* verify */
  176.         FspdevPseudoStreamMigClose, FspdevPseudoStreamMigOpen,
  177.         FspdevPseudoStreamMigrate,
  178.         Fsio_NoProc,                    /* reopen */
  179.         (Boolean (*)())NIL,                /* scavenge */
  180.         Fsio_NullClientKill, FspdevPseudoStreamClose },
  181.     /*
  182.      * A pseudo stream to a remote pseudo-filesystem server.  This is
  183.      * like the remote pseudo-device stream, except for setup because the
  184.      * pseudo-device connection is already set up by the time the
  185.      * CltOpen routine is called.
  186.      */
  187.     { FSIO_RMT_PFS_STREAM, FspdevRmtPfsStreamIoOpen,
  188.         Fsrmt_Read, Fsrmt_Write,
  189.         Fsrmt_Read, Fsrmt_Write,            /* Paging */
  190.         Fsio_NoProc,     
  191.         Fsrmt_IOControl, Fsrmt_Select,
  192.         Fsrmt_GetIOAttr, Fsrmt_SetIOAttr,
  193.         FspdevRmtPseudoStreamVerify,
  194.         Fsrmt_IOMigClose, Fsrmt_IOMigOpen,
  195.         FspdevRmtPseudoStreamMigrate,
  196.         Fsio_NoProc,                    /* reopen */
  197.         Fsutil_RemoteHandleScavenge, Fsio_NullClientKill,
  198.         Fsrmt_IOClose },
  199.     /*
  200.      * This stream type is only used during get/set I/O attributes when
  201.      * the pseudo-device server is remote.  No handles of this type are
  202.      * actually created, only fileIDs that map to FSIO_CONTROL_STREAM.  
  203.      */
  204.     { FSIO_RMT_CONTROL_STREAM, Fsio_NoProc,        /* ioOpen */
  205.         Fsio_NoProc, Fsio_NoProc,        /* read, write */
  206.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,     /* Paging */
  207.         Fsio_NoProc, Fsio_NoProc,        /* ioctl, select */
  208.         Fsrmt_GetIOAttr, Fsrmt_SetIOAttr,
  209.         (Fs_HandleHeader *(*)())Fsio_NoProc,    /* verify */
  210.         Fsio_NoProc, Fsio_NoProc,        /* release, migend */
  211.         Fsio_NoProc, Fsio_NoProc,        /* migrate, reopen */
  212.         (Boolean (*)())NIL,            /* scavenge */
  213.         (void (*)())Fsio_NoProc, Fsio_NoProc },    /* kill, close */
  214.     /*
  215.      * Stream used to pass streams from a pseudo-device server to
  216.      * a client in response to an open request.
  217.      */
  218.     { FSIO_PASSING_STREAM, FspdevPassStream,
  219.         Fsio_NoProc, Fsio_NoProc,        /* read, write */
  220.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,     /* Paging */
  221.         Fsio_NoProc, Fsio_NoProc,        /* ioctl, select */
  222.         Fsio_NoProc, Fsio_NoProc,        /* get/set attr */
  223.         (Fs_HandleHeader *(*)())Fsio_NoProc,    /* verify */
  224.         Fsio_NoProc, Fsio_NoProc,        /* release, migend */
  225.         Fsio_NoProc, Fsio_NoProc,        /* migrate, reopen */
  226.         (Boolean (*)())NIL,            /* scavenge */
  227.         (void (*)())Fsio_NoProc, Fsio_NoProc },    /* kill, close */
  228.  
  229.  
  230. };
  231.  
  232. static int numPdevFileStreamOps = sizeof(pdevFileStreamOps)/
  233.                  sizeof(pdevFileStreamOps[0]);
  234.  
  235. /*
  236.  *----------------------------------------------------------------------
  237.  *
  238.  * FsdPdevRmtInitializeOps --
  239.  *
  240.  *    Initialize the fsOpTable switch for the remote domain naming 
  241.  *    and remote domain streams.
  242.  *
  243.  * Results:
  244.  *    None.
  245.  *
  246.  * Side effects:
  247.  *    None.
  248.  *
  249.  *----------------------------------------------------------------------
  250.  */
  251.  
  252. void
  253. Fspdev_InitializeOps()
  254. {
  255.     int    i;
  256.  
  257.     Fs_InstallDomainLookupOps(FS_PSEUDO_DOMAIN, &pdevDomainLookup, 
  258.             &pdevAttrOpTable);
  259.     for (i = 0; i < numPdevFileStreamOps; i++)  { 
  260.     Fsio_InstallStreamOps(pdevFileStreamOps[i].type, &(pdevFileStreamOps[i]));
  261.     }
  262.     for (i = 0; i < numPdevOpenOps; i++)  { 
  263.     Fsio_InstallSrvOpenOp(pdevOpenOps[i].type, &(pdevOpenOps[i]));
  264.     }
  265.  
  266. }
  267.  
  268. /*
  269.  *----------------------------------------------------------------------
  270.  *
  271.  * Fspdev_Bin() --
  272.  *
  273.  *    Setup objects to be binned.
  274.  *
  275.  * Results:
  276.  *    None.
  277.  *
  278.  * Side effects:
  279.  *    None.
  280.  *
  281.  *----------------------------------------------------------------------
  282.  */
  283.  
  284. void
  285. Fspdev_Bin()
  286. {
  287.     Mem_Bin(sizeof(Fspdev_ServerIOHandle));
  288.     Mem_Bin(sizeof(Fspdev_ControlIOHandle));
  289. }
  290.  
  291.  
  292. /*
  293.  * ----------------------------------------------------------------------------
  294.  *
  295.  * FspdevPassStream --
  296.  *
  297.  *    This is called from Fs_Open as a ioOpen routine.  It's job is
  298.  *    to take an encapsulated stream from a pseudo-device server and
  299.  *    unencapsulate it so the Fs_Open returns the stream that the
  300.  *    pseudo-device server had.
  301.  *
  302.  * Results:
  303.  *    A return status.
  304.  *
  305.  * Side effects:
  306.  *    Deencapsulates a stream.
  307.  *
  308.  * ----------------------------------------------------------------------------
  309.  *
  310.  */
  311.  
  312. /* ARGSUSED */
  313. ReturnStatus
  314. FspdevPassStream(ioFileIDPtr, flagsPtr, clientID, streamData, name, ioHandlePtrPtr)
  315.     Fs_FileID        *ioFileIDPtr;    /* I/O fileID from the name server */
  316.     int            *flagsPtr;    /* Return only.  The server returns
  317.                      * a modified useFlags in Fsio_FileState */
  318.     int            clientID;    /* IGNORED */
  319.     ClientData        streamData;    /* Pointer to encapsulated stream. */
  320.     char        *name;        /* File name for error msgs */
  321.     Fs_HandleHeader    **ioHandlePtrPtr;/* Return - a handle set up for
  322.                      * I/O to a file, NIL if failure. */
  323. {
  324.     return(FAILURE);
  325. }
  326.  
  327.